/*
* m个数分成p组
* f[j][i]: j个饲养员，取前i只小猫的最小花费
* f[j][i] = min{f[j-1][k] + a[i]*(i-k) - (s[i] - s[k])}
* f[j][i] = f[j-1][k] - a[i] * k + s[k] + a[i]*i - s[i];

* f[j-1][k] + s[k] = a[i] * k - f[j][i] -  a[i]*i + s[i];
*         y        =  x   * k +        b
* 小猫按照a[i]递增排序

*/

#include <iostream>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
// #define ONLINE_JUDGE
const int N = 1e5 + 10, M = 1e5 + 10, P = 110;

int n,m,p;
int d[N], t[N], a[N], s[N]; // d:i座山->1座山的距离(时间) t:第i只小猫玩耍时间 a:第i只小猫最早被接走的出发时刻
int f[P][M];
int q[M];

int getY(int k, int i){ return f[i-1][k] + s[k];}

signed main()
{
    #ifdef ONLINE_JUDGE

    #else
    freopen("./in.txt","r",stdin);
    #endif
    ios::sync_with_stdio(false);
	cin.tie(0);

    cin >> n >> m >> p;

    for(int i = 2; i <= n; i++)
    {
        cin >> d[i]; d[i] += d[i-1];
    }

    for(int i = 1; i <= m; i++)
    {
        int h; cin >> h >> t[i];
        a[i] = t[i] - d[h];
    }

    sort(a+1, a+m+1);

    for(int i = 1; i <= m; i++) s[i] = s[i-1] + a[i];

    memset(f, 0x3f, sizeof f);
    for(int i = 0; i <= p; i++) f[i][0] = 0;

    for(int j = 1; j <= p; j++)
    {
        int hh = 0, tt = 0;
        q[0] = 0;

        for(int i = 1; i <= m; i++)
        {
            while(hh < tt && (getY(q[hh+1], j) - getY(q[hh], j)) <= a[i] * (q[hh+1] - q[hh]))  hh++;
            int k = q[hh];
            f[j][i] = f[j-1][k] - a[i] * k + s[k] + a[i]*i - s[i];
            while(hh < tt && (getY(q[tt], j) - getY(q[tt-1], j)) * (i - q[tt]) >= (getY(i, j) - getY(q[tt], j)) * (q[tt] - q[tt - 1])) tt--;
            q[++tt] = i;
        }
    }

    cout << f[p][m] << endl;
    return 0;
}

